const { getOpenAI } = require('./common');
const { LONG_MODEL_NAME } = require('./config');
const path = require('path');
const fs = require('fs-extra');

exports.askLongAI = async function (params) {
    const { fileList, prompt } = params;
    const messages = [];
    const fileIdList = fileList.map((e) => e.fileId);
    const sysPrompt = `# 你是谁
        > 你是政府的文档审查智能助手，能够帮助办公人员审查民众提交的各种文档资料
        > 你处事严谨，严格按照办公人员提出的要求完成任务
        # 你诞生的背景
        > 人工审查文档不仅速度慢，且很容易遗漏，需要人工智能辅助审查
        > 你被创造出来，以帮助办公人员完成审查任务
        # 你的知识来源
        > 你审查的主要依据来源于《营业性演出管理条例》
        > 你还会依这些法律法规来辅助理解：《中华人民共和国安全生产法》、《中华人民共和国消防法》、《大型群众性活动安全管理条例》、
          《文化部关于规范营业性演出票务市场经营秩序的通知》、《文化和旅游部、公安部关于进一步加强大型营业性演出活动规范管理促进演出市场健康有序发展的通知》、
        > 你定期更新，确保信息的准确性和时效性
        # 你的能力
        > 你具备强大的自然语言处理能力，可以理解并解析办公人员的查询
        > 你可以辅助政府的办公人员审查文档，你的存在是为了审查文档
        > 你具备多语言识别和理解能力，可以识别文档中各种语言内容
        # 你对话的人群
        > 找你聊天、向你提问的都是政府办公人员，请用专业严谨的态度对待
        > 你理解他们的时间宝贵，因此总是直接切入正题，提供他们所需的信息
        # 你的注意事项
        > 你审查的文档是用户上传给你的附件，有且仅限这些文档
        > “附件”是指附件列表里指代的文档`;
    messages.push(createSystemMessage(sysPrompt));
    for (const fileId of fileIdList) {
        messages.push(createUserMessage(`fileid://${fileId}`));
    }
    messages.push(
        createUserMessage('附件列表：' + JSON.stringify(fileList))
    );
    messages.push(createUserMessage(prompt));
    const openAI = await getOpenAI();
    const completion = await openAI.chat.completions.create({
        model: LONG_MODEL_NAME,
        messages,
        top_p: 0.1,
        presence_penalty: -1,
        seed: 1,
        stream: true,
    });
    return completion;
};

function createSystemMessage(message) {
    return {
        role: 'system',
        content: message,
    };
}

function createUserMessage(message) {
    return {
        role: 'user',
        content: message,
    };
}

exports.ocr = async function ({ imagePath, prompt }) {
    const res = await createImagesCompletion({
        prompt,
        images: [imagePath],
        model: OCR_MODEL,
    });
    let resContent;
    try {
        resContent = res?.choices[0]?.message?.content;
        if (!resContent) {
            console.log('没有content');
            return res;
        }
        resContent = resContent.match(/{[\s\w\W]*}/gm)[0];
        resContent = resContent.replace(/\n/gm, '');
        const resJson = JSON.parse(resContent);
        return resJson;
    } catch (error) {
        console.log('解释JSON失败: ' + resContent);
        console.log('AI返回：' + JSON.stringify(res));
        return res;
    }
};
